package cl.gob.minvu.catastro.ejb.imp;

import java.math.BigInteger;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.LocalBean;
import javax.ejb.Stateful;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.jboss.logging.Logger;

import cl.gob.minvu.catastro.ejb.FichaEJBRemote;
import cl.gob.minvu.catastro.model.DanoVivienda;
import cl.gob.minvu.catastro.model.EstadoFicha;
import cl.gob.minvu.catastro.model.Ficha;
import cl.gob.minvu.catastro.model.InstalacionDomiciliaria;

@Stateful
@LocalBean
public class FichaEJB implements FichaEJBRemote {

	private static final Logger logger = Logger.getLogger(FichaEJB.class);

	@PersistenceContext(unitName = "appCatastro")
	private EntityManager em;

	@PostConstruct
	private void init() {
	}

	@Override
	public List<Ficha> list(Ficha ficha) {
		List<Ficha> fichas = new LinkedList<Ficha>();

		try {
			List<Ficha> fichas2 = em.createQuery("SELECT f FROM Ficha f", Ficha.class)
					.getResultList();
			
			Iterator<Ficha> iter = fichas2.iterator();
			
			while (iter.hasNext()) {
				Ficha f = (Ficha) iter.next();
				f.setInstalacionDomiciliarias(this.listDomiciliarias(f));
				f.setDanoViviendas(this.listDanioVivienda(f));
				fichas.add(f);
			}
			
		} catch (Exception e) {
			logger.error(e, e);
		}

		return fichas;
	}
	
	/**
	 * @param idFicha
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private List<DanoVivienda> listDanioVivienda(Ficha ficha) {
		List<DanoVivienda> listDanio = new LinkedList<DanoVivienda>();
		
		try {
			String sql = "SELECT d FROM DanoVivienda d WHERE d.ficha = :ficha";
			Query query = em.createQuery(sql);
			query.setParameter("ficha", ficha);
			
			listDanio = query.getResultList();
			
		} catch (Exception e) {
			logger.error(e, e);
		}
		
		return listDanio;
	}
	
	/**
	 * @param idFicha
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private List<InstalacionDomiciliaria> listDomiciliarias(Ficha ficha) {
		List<InstalacionDomiciliaria> domiciliarias = new LinkedList<InstalacionDomiciliaria>();
		
		try {
			String sql = "SELECT i FROM InstalacionDomiciliaria i WHERE i.ficha = :ficha";
			Query query = em.createQuery(sql);
			query.setParameter("ficha", ficha);
			
			domiciliarias = query.getResultList();
			
		} catch (Exception e) {
			logger.error(e, e);
		}
		
		return domiciliarias;
	}

	@Override
	public Ficha findById(BigInteger idFicha) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Boolean update(Ficha ficha) {
		boolean result = false;

		try {
			Ficha f = em.getReference(Ficha.class, ficha.getIdficha());
			f.setEstadoFicha(ficha.getEstadoFicha());
			result = true;

		} catch (Exception e) {
			logger.error(e, e);
		}

		return result;
	}

	@Override
	public List<EstadoFicha> estadoFichas() {
		List<EstadoFicha> estadoFichas = new LinkedList<EstadoFicha>();

		try {
			estadoFichas = em.createNamedQuery("EstadoFicha.findAll", EstadoFicha.class).getResultList();
		} catch (Exception e) {
			logger.error(e, e);
		}

		return estadoFichas;
	}

}
